Doris FE 启动报错:JVM 内存申请失败(errno=12)解决方案

20次阅读
没有评论

在部署或启动 Doris FE(Frontend)时,不少同学会遇到 OpenJDK 抛出的内存申请失败警告,具体报错如下:

OpenJDK 64-Bit Server VM warning: INFO: os::commit_memory(0x0000000600000000, 8589934592, 0) failed; error='Not enough space' (errno=12)

初次遇到这个报错很容易误以为是磁盘空间不足,但实际上核心原因是 JVM 启动时向操作系统申请的内存超出了系统可用资源限制,本文将从错误解析、快速排查、分步解决、生产配置四个维度,帮你彻底解决这个问题,适用于新手和运维同学参考。

一、错误核心解析(先搞懂为什么报错)

先拆解报错信息,避免误判:

  • 8589934592对应 8GB 内存:这是 Doris FE 启动时,JVM 试图向操作系统提交的内存大小(主要是堆内存);
  • error='Not enough space':并非磁盘空间不足,而是 系统物理内存、虚拟内存或地址空间不足
  • errno=12:对应系统错误码ENOMEM,明确表示“系统没有足够的内存或地址空间供进程使用”。

补充说明:Doris FE 作为 Doris 的前端节点,负责元数据管理、SQL 解析优化等核心功能,默认启动时会配置较大的 JVM 堆内存(通常为 8GB),如果服务器配置较低(如 8核16G 及以下),或系统其他进程占用过多内存,就会触发这个报错。

二、3步快速排查(定位问题根源)

报错后不用盲目操作,先通过3个命令快速定位问题所在,优先排查最常见的原因。

1. 检查系统可用内存

执行以下命令,查看系统当前可用内存:

free -h

重点关注 available 字段(真正可被应用程序使用的内存),要求:available ≥ 8GB + 2-4GB 预留内存(预留内存供系统其他进程使用)。

示例:如果 available 显示为 6GB,而 JVM 要申请 8GB,直接会报错,这是最常见的情况。

2. 查看 Doris FE 的 JVM 配置

Doris FE 的 JVM 配置存放在 conf/fe.conf 文件中,执行以下命令查看具体配置:

cat /path/to/doris/conf/fe.conf | grep JAVA_OPTS

通常会看到类似配置:

JAVA_OPTS="-Xmx8g -Xms8g -XX:MetaspaceSize=512m -XX:MaxMetaspaceSize=1024m -XX:+UseG1GC"

其中 -Xmx8g 是 JVM 最大堆内存,-Xms8g 是初始堆内存,两者默认设为 8GB,这是报错的核心诱因之一。

3. 检查系统虚拟内存与地址空间限制

即使系统有足够物理内存,系统的虚拟内存限制、地址空间限制过低,也会导致 JVM 内存申请失败,执行以下两个命令检查:

# 查看进程虚拟内存上限(单位 KB)
ulimit -v
# 查看 mmap 区域数上限(影响内存映射)
cat /proc/sys/vm/max_map_count

合格标准:

  • ulimit -v 输出需 ≥ 8388608 KB(即 8GB),建议设为 unlimited(无上限);
  • vm.max_map_count 输出需 ≥ 65530(默认可能较低,需手动调整)。

三、分步解决方案(按优先级排序,新手优先选方案1)

根据排查结果,按以下优先级解决,既能快速恢复服务,又能避免后续复发。

方案1:降低 FE 的 JVM 堆内存(最直接、最推荐)

如果系统可用内存不足 8GB,或服务器配置较低(如 8核16G),直接降低 JVM 堆内存,适配服务器配置即可。

  1. 编辑 FE 配置文件:
  2. 找到 JAVA_OPTS 配置,修改 -Xmx-Xms 的值(两者设为相同,避免动态扩容消耗资源):
  3. 8核16G 服务器:JAVA_OPTS="-Xmx4g -Xms4g -XX:MetaspaceSize=512m -XX:MaxMetaspaceSize=1024m -XX:+UseG1GC"
  4. 16核32G 服务器:JAVA_OPTS="-Xmx8g -Xms8g -XX:MetaspaceSize=512m -XX:MaxMetaspaceSize=1024m -XX:+UseG1GC"
  5. 32核64G 服务器:JAVA_OPTS="-Xmx16g -Xms16g -XX:MetaspaceSize=1024m -XX:MaxMetaspaceSize=2048m -XX:+UseG1GC"
  6. 重启 Doris FE,使配置生效:

注意:堆内存不宜设得过低(最低不低于 2GB),否则可能导致 FE 运行时内存溢出(OOM),影响元数据管理和 SQL 执行。

方案2:调高系统虚拟内存与地址空间限制

如果系统可用内存充足,但仍报错,大概率是系统限制了进程的内存使用,需手动放开限制,分临时生效和永久生效两种方式。

1. 临时生效(当前会话有效,重启服务器后失效)

# 放开虚拟内存上限(无限制)
ulimit -v unlimited
# 放开文件描述符限制(避免后续其他报错)
ulimit -n 65535
# 调高 mmap 区域数上限
sysctl -w vm.max_map_count=65530

设置完成后,重新启动 Doris FE 即可。

2. 永久生效(重启服务器后仍有效,推荐生产环境配置)

# 编辑 limits.conf 文件,添加内存和文件描述符限制
echo "* soft memlock unlimited" >> /etc/security/limits.conf
echo "* hard memlock unlimited" >> /etc/security/limits.conf
echo "* soft nofile 65535" >> /etc/security/limits.conf
echo "* hard nofile 65535" >> /etc/security/limits.conf

# 编辑 sysctl.conf 文件,添加 mmap 限制
echo "vm.max_map_count=65530" >> /etc/sysctl.conf

# 使配置立即生效
sysctl -p

配置完成后,重启 Doris FE,后续重启服务器也不会恢复默认限制。

方案3:释放系统内存(临时应急,不推荐长期依赖)

如果系统内存被其他无关进程占用过多,可临时释放内存(生产环境需避开业务高峰,避免影响其他服务)。

# 清理系统缓存(慎用,缓存会被清空,可能影响后续读取性能)
sync && echo 3 > /proc/sys/vm/drop_caches

# 查看占用内存最高的进程
top -o %mem
# 杀死无关的高内存进程(替换 <PID> 为实际进程ID)
kill -9 <PID>

提示:清理缓存后,系统后续读取文件会重新加载缓存,短期可能有性能波动,仅作为应急方案。

方案4:关闭 Swap(Doris 官方推荐,优化内存使用)

Swap 分区(交换分区)会将内存数据交换到磁盘,导致 Doris FE 运行卡顿,甚至间接引发内存申请失败,Doris 官方建议关闭 Swap。

# 临时关闭 Swap
swapoff -a

# 永久关闭 Swap(注释 /etc/fstab 中的 Swap 配置)
sed -i '/swap/s/^/#/' /etc/fstab

关闭后,系统会优先使用物理内存,提升 Doris FE 运行效率,同时避免 Swap 引发的内存相关问题。

四、生产环境推荐配置(避坑指南)

结合 Doris 官方建议和实际运维经验,整理不同服务器配置对应的 FE JVM 推荐配置,避免盲目设置:

服务器配置 JVM 配置(JAVA_OPTS) 备注
8核16G -Xmx4g -Xms4g -XX:MetaspaceSize=512m -XX:MaxMetaspaceSize=1024m -XX:+UseG1GC 单 FE 节点,适合测试或小型集群
16核32G -Xmx8g -Xms8g -XX:MetaspaceSize=512m -XX:MaxMetaspaceSize=1024m -XX:+UseG1GC 单 FE 节点,适合中型集群(10-50节点)
32核64G -Xmx16g -Xms16g -XX:MetaspaceSize=1024m -XX:MaxMetaspaceSize=2048m -XX:+UseG1GC 主 FE 节点,适合大型集群(50+节点)
64核128G -Xmx32g -Xms32g -XX:MetaspaceSize=2048m -XX:MaxMetaspaceSize=4096m -XX:+UseG1GC 主 FE 节点,适合超大型集群或高并发场景

五、常见误区与注意事项

  • 误区1:认为报错是磁盘满 → 排查 df -h 确认磁盘空间,该报错与磁盘无关;
  • 误区2:盲目调高 JVM 堆内存 → 堆内存过大可能导致 GC 耗时过长,甚至系统 OOM,需适配服务器配置;
  • 注意1:修改 fe.conf 后必须重启 FE,配置才会生效;
  • 注意2:生产环境建议部署 FE 集群(1主2备),避免单节点故障,主备节点配置需一致;
  • 注意3:定期查看 FE 日志(log/fe.log),如果出现 OutOfMemoryError,说明堆内存设置过低,需适当调高。

六、总结

Doris FE 启动报错 os::commit_memory failed; error='Not enough space' (errno=12),核心是 JVM 申请的内存超出系统可用资源限制,解决优先级:

降低 FE JVM 堆内存(方案1)→ 调高系统内存限制(方案2)→ 释放系统内存(方案3)→ 关闭 Swap(方案4)

新手可优先执行方案1,快速恢复服务;生产环境建议结合方案1、2、4,从根本上避免报错复发。如果按照上述步骤仍无法解决,可查看 FE 日志,进一步定位是否有其他进程占用内存,或服务器硬件配置是否满足 Doris 运行要求。

正文完
可以使用微信扫码关注公众号(ID:xzluomor)
post-qrcode
 0
评论(没有评论)
验证码